#coding=utf-8
__metaclass__=type #新式类

import re
import pycurl

class encSearBase():
  def __init__(self,url="",patt=r'',isP=False,data=r''):
    '''Initalize''' 
    self.setItem(url,patt,isP,data) 
    self.rq=pycurl.Curl()   #创建请求 
    self.ansResponse=""
    
  def setItem(self,url="",patt=r'',isP=False,data=r''):         #设置基本变量
    '''Set parameters manully'''
    self.siteUrl=url       #网站地址
    self.webPattern=patt   #匹配结果的正则
    self.isPost=isP     #是否是Post的数据
    self.dataSyx=data      #数据格式，其中，填写MD5的地方用FUZZ代替
    self.enc=''           #要破解的数据  
    
  def genDataSytax(self):                    #生成传送的数据
    setDataP=re.compile(r'FUZZ')  #替换
    encData=setDataP.sub(self.enc,self.dataSyx,1)
    return encData
 
  def anlResponse(self):                       #解析返回的东西
    '''Analyze result html file'''
    #print self.ansResponse
    andPat=re.compile(self.webPattern,re.S)
    self.ans=andPat.search(self.ansResponse)
    if self.ans!=None:
      return self.ans.group(0)
    else:
      return "Not Found!"
      
  def getAnswer(self,data):                 #通用接口
    '''Send request to HTTP HOST'''
    "Site=>"+self.siteUrl+":"
    
    self.enc=data   #赋值数据
    encData=self.genDataSytax()    #生成数据的传送格式
        
    self.rq.setopt(pycurl.FOLLOWLOCATION, 1)
    self.rq.setopt(pycurl.MAXREDIRS, 5)  #重定向次数
    self.rq.setopt(pycurl.CONNECTTIMEOUT,60)  #连接超时
    self.rq.setopt(pycurl.TIMEOUT,300)    #下载超时
    self.rq.setopt(pycurl.USERAGENT,'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0')   #模拟浏览器

    if self.isPost:
      self.rq.setopt(pycurl.URL,self.siteUrl)
      self.rq.setopt(pycurl.POSTFIELDS,encData)
    else:
      url_GET=self.siteUrl+'?'+encData
      self.rq.setopt(pycurl.URL,url_GET)
    self.ansResponse=""
    self.rq.setopt(pycurl.WRITEFUNCTION,self.__genResponse)
    self.rq.perform()
    hCode=self.rq.getinfo(self.rq.HTTP_CODE)
    if hCode==200:
      siteNameP=re.compile(r'(?<=http\:\/\/).*?(?=\/)',re.S)
      siteName=siteNameP.search(self.siteUrl)
      return "Site=>"+siteName.group(0)+":"+self.anlResponse()            #使用anlResponse解析结果
    else:
      return "Http Error:"+hCode
      
  def __genResponse(self,htmlData):    #保存response结果的函数,私有
    '''Save response'''
    self.ansResponse+=htmlData

#######################################以上是超类##################################################################    
